package com.zkh.myutils.net.smtp;

import java.io.IOException;

import com.zkh.myutils.code.Charsets;
import com.zkh.myutils.code.CoderUtils;
import com.zkh.myutils.io.log.Logger;
import com.zkh.myutils.net.ClientFactory;
import com.zkh.myutils.net.utils.NetUtils;
import com.zkh.myutils.net.utils.Reply;
import com.zkh.myutils.utils.UtilsException;

/**
 * SMTP客户端
 * @author zkh
 */
public class SMTPClient extends SMTP{
	// 主机
	private String hostname;
	// 用户名
	private String username;
	// 密码
	private String password;
	// 发件人
	private String from;
	// 邮件发送端口
	private int port;
	
	/**
	 * 构造方法
	 * @param hostname 主机
	 * @param port 端口号
	 * @param username 用户
	 * @param password 密码
	 * @param from 发件人
	 */
	public SMTPClient(String hostname, int port, String username, String password, String from) {
		this.hostname = hostname;
		this.port = port;
		this.username = CoderUtils.encodeBase64(username);
		this.password = CoderUtils.encodeBase64(password);
		this.from = from;
	}
	
	/**
	 * 初始化SMTP连接
	 */
	public void init() throws IOException{
		//失效
		if(!isAvailable()){
			//设置编码
			this.setCharset(Charsets.UTF_8);
			//打印记录
			Logger.debug("开始连接邮件服务器");
			//如果启用SSL，设置SSL Socket工厂
			if(ClientFactory.isEmailEnableSSL()) {
				//设置SSL Socket工厂
				this.setSocketFactory(NetUtils.getSSLDefaultSocketFactory());
			}
			//连接主机
			this.connect(hostname, port);
			//建立连接
			this.hello(hostname);
			//权限验证
			this.authLogin(username, password);
			//检查是否登录成功
			int replyCode = this.getReplyCode();
			//连接失败，报错
			if(!Reply.isPositiveCompletion(replyCode)){
				throw new UtilsException("邮件服务器连接失败");
			}else{
				Logger.debug("邮件服务器连接成功");
			}
		}
	}
	
	/**
	 * 发送DATA命令前准备
	 * @param recipients 接收人
	 */
	public boolean sendDataBefore(String... recipients) throws IOException {
		//设置成功标识
		boolean oneSuccess = false;
		//设置发送人
		if (!setSender(from)) {
			return false;
		}
		//设置接收人
		for (String recipient : recipients) {
			//设置接收人
			if (addRecipient(recipient)) {
				//成功标识
				oneSuccess = true;
			}
		}
		//有一个成功，就标记成功
		return oneSuccess;
	}
	
	/**
	 * 检查是否成功。在邮件发送后，检查响应状态
	 */
	public boolean isSuccess() throws IOException {
		//获取响应
		return Reply.isPositiveCompletion(getReply());
	}

	/**
	 * 获取发件人
	 */
	public String getFrom() {
		return from;
	}
}
